package com.raos.example.redis.networkmodel.nio;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

/**
 * NIO网络模型 -- NIO服务端
 *
 * @author raos
 * @emil 991207823@qq.com
 * @date 2021/7/23 22:52
 **/
public class NIOServerSocket {
    // NIO中的核心
    // channel -- 通道
    // buffer -- 缓存
    // selector -- Selector（选择器）是Java NIO中能够检测一到多个NIO通道，并能够知晓通道是否为诸如读写事件做好准备的组件。
    //            这样一个单独的线程可以管理多个channel，从而管理多个网络连接。

    public static void main(String[] args) {
        try {
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            //设置连接非阻塞
            serverSocketChannel.configureBlocking(false);
            //设置监听端口
            serverSocketChannel.socket().bind(new InetSocketAddress(8080));
            while (true) {
                //是非阻塞的
                //获得一个客户端连接
                SocketChannel socketChannel = serverSocketChannel.accept();
                //IO非阻塞
//                socketChannel.configureBlocking(false);
                if (socketChannel != null) {
                    ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
                    int i = socketChannel.read(byteBuffer);
                    System.out.println("接收数据长度= " + i);
                    Thread.sleep(1000);
                    //反转--将数据写出去
                    byteBuffer.flip();
                    socketChannel.write(byteBuffer);
                } else {
                    Thread.sleep(1000);
                    System.out.println("连接位就绪");
                }
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

    }
}
